链表中LinkList L与LinkList *L的区别

您所在的位置:网站首页 la p什么意思 链表中LinkList L与LinkList *L的区别

链表中LinkList L与LinkList *L的区别

2023-09-20 14:39| 来源: 网络整理| 查看: 265

1 2 3 4 typedef  struct  Node{ int  elem; struct  node * next; }node,*LinkList;

  

对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem;

对于LinkList *L:L是指向定义的Node结构体指针的指针,所以(*L)是指向Node结构体的指针,可以用->运算符来访问结构体成员,即(*L)->elem,当然,(**L)就是Node型结构体了,所以可以用点运算符来访问结构体成员,即(**L).elem;

在链表操作中,我们常常要用链表变量作物函数的参数,这时,用LinkList L还是LinkList *L就很值得考虑深究了,一个用不好,函数就会出现逻辑错误,其准则是: 如果函数会改变指针L的值,而你希望函数结束调用后保存L的值,那你就要用LinkList *L,这样,向函数传递的就是指针的地址,结束调用后,自然就可以去改变指针的值; 而如果函数只会修改指针所指向的内容,而不会更改指针的值,那么用LinkList L就行了;

下面说个具体实例吧!

复制代码 #include #include typedef int ElemType; typedef struct Node{ ElemType elem; struct Node * next; }Node, * LinkList; 复制代码

 

//初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用*L

void InitList(LinkList *L) { *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; }

 

//清空链表L,使L重新变为空链表,函数调用完后不会改变指针L的值,只会改变指针L所指向的内容(即L->next的值)

void ClearList(LinkList L) { LinkList p; while(p = L->next) free(p); }

 

//销毁链表L,释放链表L申请的内存,使L的值重新变为NULL,所以会改变L的值,得用*L

复制代码 1 void DestroyList(LinkList *L) 2 { 3 LinkList p; 4 while(p = (*L)->next ) 5 free(p); 6 free(*L); 7 *L = NULL; 8 } 9 10 void main() 11 { 12 LinkList L = NULL; 13 InitList(&L); 14 ClearList(L); 15 DestroyList(&L); 16 } 复制代码

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3